#ifndef __LOGER_H_
#define __LOGER_H_

#ifdef __cplusplus
extern "C"
{
#endif

#include "system.h"

/* log's level */
#define LOG_LV_ASSERT       0
#define LOG_LV_ERROR        1
#define LOG_LV_WARN         2
#define LOG_LV_INFO         3
#define LOG_LV_DEBUG        4
#define LOG_LV_VERBOSE      5
#define LOG_LV_MAX          6

#if (CONFIG_LOGER_ENABLE == 1)
  /* 0.ASSERT */
  #if (CONFIG_LOGER_LEVEL >= LOG_LV_ASSERT)
    #define LOG_A(tag, ...) loger_output(LOG_LV_ASSERT, tag, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
  #else
    #define LOG_A(tag, ...)
  #endif
  /* 1.ERROR */
  #if (CONFIG_LOGER_LEVEL >= LOG_LV_ERROR)
    #define LOG_E(tag, ...) loger_output(LOG_LV_ERROR, tag, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
  #else
    #define LOG_E(tag, ...)
  #endif
  /* 2.WARN */
  #if (CONFIG_LOGER_LEVEL >= LOG_LV_WARN)
    #define LOG_W(tag, ...) loger_output(LOG_LV_WARN, tag, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
  #else
    #define LOG_W(tag, ...)
  #endif
  /* 3.INFO */
  #if (CONFIG_LOGER_LEVEL >= LOG_LV_INFO)
    #define LOG_I(tag, ...) loger_output(LOG_LV_INFO, tag, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
  #else
    #define LOG_I(tag, ...)
  #endif
  /* 4.DEBUG */
  #if (CONFIG_LOGER_LEVEL >= LOG_LV_DEBUG)
    #define LOG_D(tag, ...) loger_output(LOG_LV_DEBUG, tag, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
  #else
    #define LOG_D(tag, ...)
  #endif
  /* 5.VERBOSE */
  #if (CONFIG_LOGER_LEVEL >= LOG_LV_VERBOSE)
    #define LOG_V(tag, ...) loger_output(LOG_LV_VERBOSE, tag, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
  #else
    #define LOG_V(tag, ...)
  #endif
#else
#define LOG_A(tag, ...)
#define LOG_E(tag, ...)
#define LOG_W(tag, ...)
#define LOG_I(tag, ...)
#define LOG_D(tag, ...)
#define LOG_V(tag, ...)
#endif

#define LOG_RAW(tag, ...)   loger_raw(__VA_ARGS__)

/* export func */


int loger_init(void);

void loger_raw(const char *format, ...);
void loger_output(uint8_t level, const char *tag, const char *file, const char *func, const long line, const char *format, ...);
void loger_set_text_color_enable(uint8_t en);

#ifdef __cplusplus
}
#endif

#endif // __LOGER_H_
